home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload Trio 2
/
Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO
/
dir39
/
dpmiv1.zip
/
DPMIV1.TXT
Wrap
Text File
|
1993-08-18
|
139KB
|
4,058 lines
Int 2FH Function 1680H [1.0]
Release Current Virtual Machine's Time Slice
Called by a client program to indicate that the program is
idle (for example, waiting for keyboard input). This allows
the DPMI host to pass the CPU to other clients, or take
power-conserving measures on laptop and notebook computers.
Call With:
AX = 1680H
Returns:
if function supported by host
AL = 0
if function not supported by host
AL = unchanged (80H)
Notes:
o This function is not specific to DPMI hosts. Some
operating systems will recognize this call for programs
running in real mode. Programmers are encouraged to use
this call in all DOS and DPMI-client programs. All DPMI
hosts will hook Int 2FH and so a DPMI client can use this
API without any other precautions. Non-DPMI programs
that can run on DOS 2.xx or earlier should make sure that
the Int 2FH vector is non-zero before executing the Int
2FH.
o When an application calls this function it will regain
control at intervals, so it should continue to re-issue
this function call so long as it has nothing to do.
o DPMI client and application vendors are encouraged to use
this function. It can significantly improve the
performance of a DOS-based multitasking host.
Int 2FH Function 1686H [0.9]
Get CPU Mode
Returns information about the current CPU mode. Programs
which only execute in protected mode do not need to call
this function.
Call With:
AX = 1686H
Returns:
if executing in protected mode
AX = 0
if executing in real mode or Virtual 86 mode
AX = nonzero
Notes:
o Some environments support programs or libraries that can
execute in either real or protected mode (bimodal code).
This function is supplied so that such programs can
detect at run time whether they are running in protected
mode and make use of system facilities accordingly.
o This function should not be used to determine if a DPMI
host is present. A client should make sure that DPMI
services are available before calling this function;
otherwise, the results returned by the function may not
be valid.
Int 2FH Function 1687H [0.9]
Obtain Real-to-Protected Mode Switch Entry Point
This function can be called in real mode only to test for
the presence of a DPMI host, and to obtain an address of a
mode switch routine that can be called to begin execution in
protected mode.
Call With:
AX = 1687h
Returns:
if function successful
AX = 0
BX = flags
Bit Significance
0 0 = 32-bit programs are not supported
1 = 32-bit programs are supported
1-15 not used
CL = processor type
02H = 80286
03H = 80386
04H = 80486
05H-FFH Reserved for future Intel processors
DH = DPMI major version as a decimal number
(represented in binary)
DL = DPMI minor version as a decimal number
(represented in binary)
SI = number of paragraphs required for DPMI host
private data (may be 0)
ES:DI = segment:offset of procedure to call to enter
protected mode
if function unsuccessful (no DPMI host present)
AX = nonzero
Notes:
o The entry point returned by Int 2FH Function 1687H is
only called for the first switch to protected mode by a
DPMI client. For further details on the protocol for
switching to protected mode and the environment after
switching to protected mode, see page 22.
o Under DPMI hosts, the major version number is returned in
DH and the minor version number is returned in DL. There
are two decimal digits for the minor version number with
the least-significant digit representing the revision
number of the minor version number. Under DPMI version
0.9 hosts, DH is returned as 0, and DL is returned as
decimal 90 (5AH). In hypothetical DPMI version 2.3, DH
would be returned as 2 and DL would be returned as 30
(1EH).
Int 2FH Function 168AH [1.0]
Get Vendor-Specific API Entry Point
Returns an address which can be called to use host-specific
extensions to the standard set of DPMI functions. This
function is available only in protected mode.
Call With:
AX = 168AH
DS:(E)SI= selector:offset of ASCIIZ (null-terminated)
string identifying the DPMI host vendor
Returns:
if function successful
AL = 0
ES:(E)DI= extended API entry point
and DS, FS, GS, EAX, EBX, ECX, EDX, ESI, and EBP are
preserved.
if function unsuccessful
AL = unchanged (8AH)
Notes:
o The ASCIIZ string specifies a host vendor name or some
other unique identifier to obtain a specific extension
entry point. The string comparison used to look up the
API entry point is case-sensitive.
o Clients must use a FAR CALL to reach the extended API
entry point.
o All extended API parameters are specified by the vendor.
o DPMI 1.0 clients should use this function in preference
to Int 31H Function 0A00H. This method of API extension
is preferable to the Int 31H extension as it avoids the
creation of a long (and consequently slow) chain of Int
31H handlers which would slow down time-critical DPMI
functions. Note that although this function was not
documented for DPMI 0.9, it will work under any DPMI 0.9
host.
Int 31H Function 0000H [0.9]
Allocate LDT Descriptors
Allocates one or more descriptors in the task's Local
Descriptor Table (LDT). The descriptor(s) allocated must be
initialized by the application with other function calls.
Call With:
AX = 0000H
CX = number of descriptors to allocate
Returns:
if function successful
Carry flag= clear
AX = base selector
if function unsuccessful
Carry flag= set
AX = error code
8011H descriptor unavailable
Notes:
o If more than one descriptor was requested, the function
returns a base selector referencing the first of a
contiguous array of descriptors. The selector values for
subsequent descriptors in the array can be calculated by
adding the value returned by Int 31H Function 0003H.
o The allocated descriptor(s) will be set to "data" with
the present bit set and a base and limit of zero. The
privilege level of the descriptor(s) will match the
application's code segment privilege level.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0001H [0.9]
Free LDT Descriptor
Frees an LDT descriptor.
Call With:
AX = 0001H
BX = selector for the descriptor to free
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8022Hinvalid selector
Notes:
o Each descriptor allocated with Int 31H Function 0000H
must be freed individually with this function, even if it
was previously allocated as part of a contiguous array of
descriptors.
o Under DPMI 1.0 hosts, any segment registers which contain
the selector being freed are zeroed by this function.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0002H [0.9]
Segment to Descriptor
Maps a real mode segment (paragraph) address onto an LDT
descriptor that can be used by a protected mode program to
access the same memory.
Call With:
AX = 0002H
BX = real mode segment address
Returns:
if function successful
Carry flag= clear
AX = selector for real mode segment
if function unsuccessful
Carry flag= set
AX = error code
8011H descriptor unavailable
Notes:
o The descriptor's limit will be set to 64 KB.
o Multiple calls to this function with the same segment
address will return the same selector.
o The intent of this function is to provide clients with
easy access to commonly used real mode segments such as
the BIOS data area at segment 0040H and the video refresh
buffers at segments A000H, B000H, and B800H. Clients
should not call this function to obtain descriptors to
private data areas.
o Descriptors created by this function can never be
modified or freed. For this reason, the function should
be used sparingly. Clients which need to examine various
real mode addresses using the same selector should
allocate a descriptor with Int 31H Function 0000H and
change the base address in the descriptor as necessary,
using the Set Segment Base Address function (Int 31H
Function 0007H).
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0003H [0.9]
Get Selector Increment Value
The DPMI functions Allocate LDT Descriptors (Int 31H
Function 0000H) and Allocate DOS Memory Block (Int 31H
Function 0100H) can allocate
an array of contiguous descriptors, but only return a
selector for the first descriptor. The value returned by
this function can be used to calculate the selectors for
subsequent descriptors in the array.
Call With:
AX = 0003H
Returns:
Carry flag= clear (this function always succeeds)
AX = selector increment value
Notes:
o The increment value is always a power of two.
Int 31H Function 0004H [0.9]
Reserved
DPMI Function 0004H is reserved for historical reasons and
should not be called.
Int 31H Function 0005H [0.9]
Reserved
DPMI Function 0005H is reserved for historical reasons and
should not be called.
Int 31H Function 0006H [0.9]
Get Segment Base Address
Returns the 32-bit linear base address from the LDT
descriptor for the specified segment.
Call With:
AX = 0006H
BX = selector
Returns:
if function successful
Carry flag= clear
CX:DX = 32-bit linear base address of segment
if function unsuccessful
Carry flag= set
AX = error code
8022H invalid selector
Notes:
o Client programs must use the LSL instruction to query the
limit for a descriptor. Note that on 80386 machines, the
client must use the 32-bit form of LSL if the segment
size is greater than 64 KB.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0007H [0.9]
Set Segment Base Address
Sets the 32-bit linear base address field in the LDT
descriptor for the specified segment.
Call With:
AX = 0007H
BX = selector
CX:DX = 32-bit linear base address of segment
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8022H invalid selector
8025H invalid linear address (changing the base
would cause the descriptor to reference a
linear address range outside that allowed
for DPMI clients)
Notes:
o A DPMI 1.0 host will automatically reload any segment
register which contains the selector specified in
register BX. It is suggested that DPMI 0.9 hosts also
implement this.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0008H [0.9]
Set Segment Limit
Sets the limit field in the LDT descriptor for the specified
segment.
Call With:
AX = 0008H
BX = selector
CX:DX = 32-bit segment limit
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8021H invalid value (CX <> 0 on a 16-bit DPMI
host; or the limit is greater than 1 MB,
but the low twelve bits are not set)
8022H invalid selector
8025H invalid linear address (changing the
limit would cause the descriptor to
reference a linear address range outside
that allowed for DPMI clients.)
Notes:
o The value supplied to the function in CX:DX is the byte
length of the segment-1 (i.e., the value returned by the
LSL instruction).
o Segment limits greater than or equal to 1 MB must be
page-aligned. That is, limits greater than 1 MB must
have the low 12 bits set.
o This function has an implicit effect on the "G"
(granularity) bit in an 80386 descriptor's extended
access rights/type byte; i.e., it is the host's
responsibility to set the "G" bit correctly.
o Client programs must use the LSL instruction to query the
limit for a descriptor. Note that on 80386 machines, the
client must use the 32-bit form of LSL if the segment
size is greater than 64 KB.
o A DPMI 1.0 host will reload any segment registers which
contain the selector specified in register BX. It is
suggested that DPMI 0.9 hosts also implement this.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0009H [0.9]
Set Descriptor Access Rights
Modifies the access rights and type fields in the LDT
descriptor for the specified segment.
Call With:
AX = 0009H
BX = selector
CL = access rights/type byte
CH = 80386 extended access rights/type byte
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8021H invalid value (access rights/type bytes
invalid)
8022H invalid selector
8025H invalid linear address (changing the
access rights/type bytes would cause the
descriptor to reference a linear address
range outside that allowed for DPMI
clients.)
Notes:
o The access rights/type byte passed to the function in CL
has the following format:
+---+---+---+---+---+---+---+---+
| P | DPL | 1 |C/D|E/C|W/R| A |
+-+-+---+---+-+-+-+-+-+-+-+-+-+-+
| | | | | | |
| | | | | | +- 0=not accessed, 1=accessed
| | | | | +----- data: 0=read,
1=>read/write
| | | | | code: must be 1 (readable)
| | | | +--------- data: 0=expand-up,
1=expand-down
| | | | code: must be 0
(non-conforming)
| | | +------------- 0=data, 1=code
| | +----------------- must be 1
| +----------------------- must equal caller's CPL
+----------------------------- 0=absent, 1=present
If the Present bit is not set in the descriptor, the DPMI
host allows any values except in the DPL and "must be 1"
bit fields.
o On 80386 (and later) machines, the DPMI host interprets
the value passed to the function in CH as follows:
+---+---+---+---+---+---+---+---+
| G |B/D| 0 |Avl| Reserved |
+-+-+-+-+-+-+-+-+---+---+---+---+
| | | | |
| | | | +-- ignored
| | | +------------ can be 0 or 1
| | +---------------- must be 0
| +-------------------- 0=default 16-bit, 1=default
32-bit
+------------------------ 0=byte granular, 1=page
granular
o A DPMI 1.0 host will reload any segment registers which
contain the selector specified in register BX. It is
suggested that DPMI 0.9 hosts also implement this.
o Client programs should use the LAR instruction to examine
the access rights of a descriptor.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 000AH [0.9]
Create Alias Descriptor
Creates a new LDT data descriptor that has the same base and
limit as the specified descriptor.
Call With:
AX = 000AH
BX = selector
Returns:
if function successful
Carry flag= clear
AX = data selector (alias)
if function unsuccessful
Carry flag= set
AX = error code
8011H descriptor unavailable
8022H invalid selector
Notes:
o The selector supplied to the function may be either a
data selector or an executable selector. Note that the
published 0.9 specification was in error to say that the
function generates an error on a data descriptor.
o The descriptor alias returned by this function will not
track changes to the original descriptor. In other
words, if an alias is created with this function, and the
base or limit of the original segment is then changed,
the two descriptors will no longer map the same memory.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 000BH [0.9]
Get Descriptor
Copies the local descriptor table (LDT) entry for the
specified selector into an 8-byte buffer.
Call With:
AX = 000BH
BX = selector
ES:(E)DI= selector:offset of 8-byte buffer
Returns:
if function successful
Carry flag= clear
and buffer pointed to by ES:(E)DI contains descriptor
if function unsuccessful
Carry flag= set
AX = error code
8022H invalid selector
Notes:
o 32-bit programs must use ES:EDI to point to the buffer.
16-bit programs should use ES:DI.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 000CH [0.9]
Set Descriptor
Copies the contents of an 8-byte buffer into the LDT
descriptor for the specified selector.
Call With:
AX = 000CH
BX = selector
ES:(E)DI= selector:offset of 8-byte buffer containing
descriptor
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8021H invalid value (access rights/type byte
invalid)
8022H invalid selector
8025H invalid linear address (descriptor
references a linear address range outside
that allowed for DPMI clients)
Notes:
o 32-bit programs must use ES:EDI to point to the buffer.
16-bit programs should use ES:DI.
o The descriptor's access rights/type byte (byte 5) follows
the same format and restrictions as the access
rights/type parameter (in CL) for the Set Descriptor
Access R
ights function (Int 31H Function 0009H). On 80386 (or later)
machines, the descriptor's extended access rights/type
byte (byte 6) follows the same format and restrictions as
the extended access rights/type parameter (in CH) for the
same function, except the low-order 4 bits (marked
"reserved") are used to set the upper 4 bits of the
descriptor's limit.
o If the descriptor's present bit is not set, then the only
error checking is that the client's CPL must be equal to
the descriptor's DPL field and the "must be 1" bit in the
descriptor's byte 5 must be set.
o A DPMI 1.0 host will reload any segment register which
contains a selector specified in register BX. It is
suggested that DPMI 0.9 hosts also implement this.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 000DH [0.9]
Allocate Specific LDT Descriptor
Allocates a specific LDT descriptor.
Call With:
AX = 000DH
BX = selector
Returns:
if function successful
Carry flag= clear
and descriptor has been allocated
if function unsuccessful
Carry flag= set
AX = error code
8011H descriptor unavailable (descriptor is in
use)
8022H invalid selector (references GDT or
beyond the LDT limit)
Notes:
o The first 10H (16) descriptors (selector values 04H-7CH)
are reserved for this function and must not be used by
the DPMI host.
o Under DPMI 0.9 hosts, if another application has already
been loaded, some of descriptors reserved for allocation
by this function may be already in use and unavailable.
Under DPMI 1.0 hosts, each client has its own LDT and
thus will have the full 16 descriptors available for use
with this function.
o Resident service providers (protected-mode TSRs) should
not use this function.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 000EH [1.0]
Get Multiple Descriptors
Copies one or more local descriptor table (LDT) entries into
a client buffer.
Call With:
AX = 000EH
CX = number of descriptors to copy
ES:(E)DI= selector:offset of a buffer in the following
format:
Offset Length Contents
00H 2 Selector #1 (set by client)
02H 8 Descriptor #1 (returned by
host)
0AH 2 Selector #2 (set by client)
0CH 8 Descriptor #2 (returned by
host)
. . .
. . .
. . .
Returns:
if function successful
Carry flag= clear
and buffer contains copies of the descriptors for the
specified selectors
if function unsuccessful
Carry flag= set
AX = error code
8022H invalid selector
CX = number of descriptors successfully copied
Notes:
o If an error occurs because of an invalid selector or
descriptor, the function returns the number of
descriptors which were successfully copied in CX. All of
the descriptors which were copied prior to the one that
failed are valid.
o 32-bit programs must use ES:EDI to point to the buffer.
16-bit programs should use ES:DI.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 000FH [1.0]
Set Multiple Descriptors
Copies one or more descriptors from a client buffer into the
local descriptor table (LDT).
Call With:
AX = 000FH
CX = number of descriptors to copy
ES:(E)DI= selector:offset of a buffer in the following
format:
Offset Length Contents
00H 2 Selector #1
02H 8 Descriptor #1
0AH 2 Selector #2
0CH 8 Descriptor #2
. . .
. . .
. . .
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8021H invalid value (access rights/type bytes
invalid)
8022H invalid selector 8025H invalid linear
address (descriptor references a linear
address range outside that allowed for
DPMI clients)
CX = number of descriptors successfully copied
Notes:
o If an error occurs because of an invalid selector or
descriptor, the function returns the number of
descriptors which were successfully copied in CX. All of
the descriptors which were copied prior to the one that
failed are valid. All descriptors from the invalid entry
to the end of the table are not updated.
o 32-bit programs must use ES:EDI to point to the buffer.
16-bit programs should use ES:DI.
o A descriptor's access rights/type byte (byte 5) follows
the same format and restrictions as the access
rights/type parameter (in CL) for the Set Descriptor
Access Rights function (Int 31H Function 0009H). On
80386 (or later) machines, the descriptor's extended
access rights/type byte (byte 6) follows the same format
and restrictions as the extended access rights/type
parameter (in CH) for the same function, except the
low-order 4 bits (marked "reserved") are used to set the
upper 4 bits of the descriptor's limit.
o If the descriptor's present bit is not set, then the only
error checking is that the client's CPL must be equal to
the descriptor's DPL field and the "must be 1" bit in the
descriptor's byte 5 must be set.
o A DPMI 1.0 host will reload any segment register which
contains a selector specified in the data structure
supplied to this function. It is suggested that DPMI 0.9
hosts also implement this.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0100H [0.9]
Allocate DOS Memory Block
Allocates a block of memory from the DOS memory pool, i.e.
memory below the 1 MB boundary that is controlled by DOS.
Such memory blocks are typically used to exchange data with
real mode programs, TSRs, or device drivers. The function
returns both the real mode segment base address of the block
and one or more descriptors that can be used by protected
mode applications to access the block.
Call With:
AX = 0100H
BX = number of (16-byte) paragraphs desired
Returns:
if function successful
Carry flag= clear
AX = real mode segment base address of allocated
block
DX = selector for allocated block
if function unsuccessful
Carry flag= set
AX = error code
0007H memory control blocks damaged (also
returned by DPMI 0.9 hosts)
0008H insufficient memory (also returned by
DPMI 0.9 hosts).
8011H descriptor unavailable
BX = size of largest available block in paragraphs
Notes:
o If the size of the block requested is greater than 64 KB
(BX > 1000H) and the client is a 16-bit program,
contiguous descriptors are allocated and the base
selector is returned. The consecutive selectors for the
memory block can be calculated using the value returned
by the Get Selector Increment Value function (Int 31H
Function 0003H). Each descriptor has a limit of 64 KB,
except for the last which has a limit of blocksize MOD 64
KB.
o If the DPMI host is 32-bit, the client is 16-bit, and
more than one descriptor is allocated, the limit of the
first descriptor will be set to the size of the entire
block. Subsequent descriptors have limits as described
in the previous Note. 16-bit DPMI hosts will always set
the limit of the first descriptor to 64 KB even when
running on an 80386 (or later) machine.
o When the client is 32-bit, this function always allocates
only one descriptor.
o Client programs should never modify or free any
descriptors allocated by this function. The Free DOS
Memory Block function (Int 31H Function 0101H) will
deallocate the descriptors automatically.
o The DOS allocation function (Int 21H Function 48H) is
used.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0101H [0.9]
Free DOS Memory Block
Frees a memory block that was previously allocated with the
Allocate DOS Memory Block function (Int 31H Function 0100H).
Call With:
AX = 0101H
DX = selector of block to be freed
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
0007H memory control blocks damaged (also
returned by DPMI 0.9 hosts).
0009H incorrect memory segment specified (also
returned by DPMI 0.9 hosts).
8022H invalid selector
Notes:
o All descriptors allocated for the memory block are
automatically freed by this function, and are no longer
valid after this function returns.
o Under DPMI 1.0 hosts, any segment registers which contain
a selector being freed are zeroed by this function.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0102H [0.9]
Resize DOS Memory Block
Changes the size of a memory block that was previously al
located with the Allocate DOS Memory Block function (Int 31H
Function 0100H).
Call With:
AX = 0102H
BX = new block size in (16-byte) paragraphs
DX = selector of block to modify
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
0007H memory control blocks damaged (also
returned by DPMI 0.9 hosts).
0008H insufficient memory (also returned by
DPMI 0.9 hosts).
0009H incorrect memory segment specified (also
returned by DPMI 0.9 hosts).
8011H descriptor unavailable
8022H invalid selector
BX = maximum possible block size (paragraphs)
Notes:
o Requests to increase the size of an existing DOS memory
block may fail due to subsequent DOS memory block
allocations causing fragmentation of DOS memory, or
insufficient remaining DOS memory. In addition, the
function will fail if the block is growing past a 64 KB
boundary and the next descriptor in the LDT is not
available.
o A request to decrease the size of a DOS memory block may
cause some descriptors that were previously allocated to
the block to be freed and the limit of the new last
descriptor for the block to be changed.
o Under a DPMI 1.0 host, any segment registers which
contain a selector being modified are reloaded by this
function and any segment registers which contain a
selector being freed are zeroed by this function.
o Client programs should never modify or free any
descriptors allocated by this function. The Free DOS
Memory Block function (Int 31H Function 0101H) will
deallocate the descriptors automatically.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0200H [0.9]
Get Real Mode Interrupt Vector
Returns the contents of the current virtual machine's real
mode interrupt vector for the specified interrupt.
Call With:
AX = 0200H
BL = interrupt number
Returns:
Carry flag= clear (this function always succeeds)
CX:DX = segment:offset of real mode interrupt handler
Notes:
o The value returned in CX is a real mode segment address,
not a selector. Attempts to place this value into a
segment register in protected mode may cause a general
protection (GP) fault.
o All 100H (256) real mode interrupt vectors must be made
available through this function by the DPMI host.
Int 31H Function 0201H [0.9]
Set Real Mode Interrupt Vector
Sets the current virtual machine's real mode interrupt
vector for the specified interrupt.
Call With:
AX = 0201H
BL = interrupt number
CX:DX = segment:offset of real mode interrupt handler
Returns:
Carry flag= clear (this function always succeeds)
Notes:
o The address passed in CX must be a real mode segment
address, not a selector. Consequently, the interrupt
handler must either reside in DOS memory (i.e. below the
1 MB boundary) or the client must allocate a real mode
callback address. See Int 31H Functions 0100H and 0303H.
o If the interrupt being hooked is a hardware interrupt,
the memory that the interrupt handler uses must be
locked.
Int 31H Function 0202H [0.9]
Get Processor Exception Handler Vector
Returns the address of the current client's protected mode
exception handler for the specified exception number. This
function should be avoided by DPMI 1.0 clients (see Notes).
Call With:
AX = 0202H
BL = exception number (00H-1FH)
Returns:
if function successful
Carry flag= clear
CX:(E)DX= selector:offset of exception handler
if function unsuccessful
Carry flag= set
AX = error code
8021H invalid value (BL not in range 0-1FH)
Notes:
o The value returned in CX is a valid protected mode
selector, not a real mode segment address.
o 32-bit clients will be returned a 32-bit offset in the
EDX register.
o Clients which run under DPMI 1.0 should use Int 31H
Functions 0210H and 0211H to obtain the addresses of
exception handlers. This function is supported by DPMI
1.0 hosts solely for compatibility with DPMI 0.9.
Int 31H Function 0203H [0.9]
Set Processor Exception Handler Vector
Sets the address of a handler for a CPU exception or fault,
allowing a protected mode application to intercept processor
exceptions (such as segment not present faults) that are not
handled by the DPMI host and would otherwise generate a
fatal error. This function should be avoided by DPMI 1.0
clients (see Notes).
Call With:
AX = 0203H
BL = exception/fault number (00H-1FH)
CX:(E)DX= selector:offset of exception handler
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8021H invalid value (BL not in range 0-1FH)
8022H invalid selector
Notes:
o The value passed in CX should be a valid protected mode
code (executable) selector, not a real mode segment
address.
o 32-bit clients must supply a 32-bit offset in the EDX
register. If the client's handler chains to the next
exception handler, it must do so using a 32-bit interrupt
stack frame.
o Every exception is first examined by the DPMI host. If
the host does not handle the exception, it reflects the
exception to the first handler in the protected mode
exception handler chain. See page 30 for a complete
discussion of the environment and responsibilities of
protected mode exception handlers installed with this
function.
o Clients which run under DPMI 1.0 should use Int 31H
Functions 0212H and 0213H to set the addresses of
exception handlers. This function is supported by DPMI
1.0 hosts solely for compatibility with DPMI 0.9.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0204H [0.9]
Get Protected Mode Interrupt Vector
Returns the address of the current protected mode interrupt
handler for the specified interrupt.
Call With:
AX = 0204H
BL = interrupt number
Returns:
Carry flag= clear (this function always succeeds)
CX:(E)DX= selector:offset of exception handler
Notes:
o The value returned in CX is a valid protected mode
selector, not a real mode segment address.
o 32-bit clients will be returned a 32-bit offset in the
EDX register.
o DPMI hosts must make all 100H (256) interrupt vectors
available through this function.
Int 31H Function 0205H [0.9]
Set Protected Mode Interrupt Vector
Sets the address of protected mode handler for the specified
interrupt into the interrupt vector.
Call With:
AX = 0205H
BL = interrupt number
CX:(E)DX= selector:offset of exception handler
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8022H invalid selector
Notes:
o The value passed in CX should be a valid protected mode
code selector, not a real mode segment address.
o 32-bit clients must supply a 32-bit offset in the EDX
register. If the client's handler chains to the next
exception handler it must do so using a 32-bit interrupt
stack frame.
o DPMI hosts must support all 100H (256 decimal) interrupt
vectors with this function.
o Hardware interrupts are sent to the primary client of the
virtual machine while software interrupts are sent to the
current client. (See Appendix A: Glossary for definitions
of primary and current client.)
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0210H [1.0]
Get Extended Processor Exception Handler Vector
(Protected Mode)
Returns the address of the client's protected mode handler
for the specified protected mode exception.
Call With:
AX = 0210H
BL = exception number (00H-1FH)
Returns:
if function successful
Carry flag= clear
CX:(E)DX= selector:offset of exception handler
if function unsuccessful
Carry flag= set
AX = error code
8021H invalid value (BL not in range 00H-1FH)
Notes:
o DPMI 1.0 clients should use this function in preference
to Int 31H Function 0202H.
o The protected mode exceptions are sent to the protected
mode handler of the current client. (See Appendix A:
Glossary for definition of primary client.)
Int 31H Function 0211H [1.0]
Get Extended Processor Exception Handler Vector
(Real Mode)
Returns the address of the client's protected mode handler
for the specified real mode exception.
Call With:
AX = 0211H
BL = exception number (00H-1FH)
Returns:
if function successful
Carry flag= clear
CX:(E)DX= selector
:offset of exception handler
if function unsuccessful
Carry flag= set
AX = error code
8021H invalid value (BL not in range 00H-1FH)
Notes:
o CX:(E)DX does not specify a real-mode segment:offset.
The reason is that this function allows a client to get
the address of the exception handler which will receive
control in protected mode when the specified exception
occurs in real mode (i.e. the host will provide an
implied mode switch for the purposes of servicing the
exception, then return to real mode after the handler
exits)..
o Real mode exceptions are sent to the primary client of
the virtual machine.
Int 31H Function 0212H [1.0]
Set Extended Processor Exception Handler Vector
(Protected Mode)
Sets the address of the client's protected mode handler for
the specified protected mode exception.
Call With:
AX = 0212H
BL = exception/fault number (00H-1FH)
CX:(E)DX= selector:offset of exception handler
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8021H invalid value (BL not in range 00H-1FH)
8022H invalid selector
Notes:
o DPMI 1.0 clients should use this function in preference
to Int 31H Function 0203H.
o The protected mode exceptions are sent to the protected
mode handler of the current client.
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0213H [1.0]
Set Extended Processor Exception Handler Vector
(Real Mode)
Sets the address of the client's protected mode handler for
the specified real mode exception.
Call With:
AX = 0213H
BL = exception/fault number (00H-1FH)
CX:(E)DX= selector:offset of exception handler
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8021H invalid value (BL not in range 00H-1FH)
8022H invalid selector
Notes:
o CX:(E)DX does not specify a real-mode segment:offset.
The reason is that this function allows a client to set
the address of an exception handler which will receive
control in protected mode when the specified exception
occurs in real mode (i.e. the host will provide an
implied mode switch for the purposes of servicing the
exception, then return to real mode after the handler
exits).
o Real mode exceptions are sent to the primary client of
the virtual machine. (See Appendix A: Glossary for
definition of primary client.)
o Refer to the rules for descriptor usage in Appendix D.
Int 31H Function 0300H [0.9]
Simulate Real Mode Interrupt
Simulates an interrupt in real mode. The function transfers
control to the address specified by the real mode interrupt
vector. The real mode handler must return by executing an
IRET.
Call With:
AX = 0300H
BL = interrupt number
BH = flags
Bit Significance
0 reserved for historical reason, must be
zero
1-7 reserved, must be zero
CX = number of words to copy from protected mode to
real mode stack
ES:(E)DI= selector:offset of real mode register data
structure in the following format:
Offset Length Contents
00H 4 DI or EDI
04H 4 SI or ESI
08H 4 BP or EBP
0CH 4 reserved, should be zero
10H 4 BX or EBX
14H 4 DX or EDX
18H 4 CX or ECX
1CH 4 AX or EAX
20H 2 CPU status flags
22H 2 ES
24H 2 DS
26H 2 FS
28H 2 GS
2AH 2 IP (reserved, ignored)
2CH 2 CS (reserved, ignored)
2EH 2 SP
30H 2 SS
Returns:
if function successful
Carry flag= clear
ES:(E)DI= selector:offset of modified real mode register
data structure
if function unsuccessful
Carry flag= set
AX = error code
8012H linear memory unavailable (stack)
8013H physical memory unavailable (stack)
8014H backing store unavailable (stack)
8021H invalid value (CX too large)
Notes:
o 32-bit programs must use ES:EDI to point to the real mode
register data structure. 16-bit programs should use
ES:DI.
o The CS:IP in the real mode register data structure is
ignored by this function. The appropriate interrupt
handler will be called based on the value passed in BL.
o If the SS:SP fields in the real mode register data
structure are zero, a real mode stack will be provided by
the DPMI host. Otherwise, the real mode SS:SP will be
set to the specified values before the interrupt handler
is called.
o The flags specified in the real mode register data
structure will be pushed on the real mode stack's IRET
frame. The interrupt handler will be called with the
interrupt and trace flags clear.
o Values placed in the segment register positions of the
data structure must be valid for real mode; i.e. the
values must be paragraph addresses and not selectors.
o All general register fields in the data structure are
DWORDs so that 32-bit registers can be passed to real
mode. Note, however, that 16-bit hosts are not required
to pass the high word of 32-bit general registers or the
FS and GS segment registers to real mode even when
running on an 80386 or later CPU.
o The target real mode handler must return with the stack
in the same state as when it was called. This means that
the real mode code may switch stacks while it is running,
but must return on the same stack that it was called on
and must return with an IRET.
o When this function returns, the real mode register data
structure will contain the values that were returned by
the real mode interrupt handler.
o It is the caller's responsibility to remove any
parameters that were pushed on the protected mode stack.
Int 31H Function 0301H [0.9]
Call Real Mode Procedure With Far Return Frame
Simulates a FAR CALL to a real mode procedure. The called
procedure must return by executing a RETF (far return)
instruction.
Call With:
AX = 0301H
BH = flags
Bit Significance
0 reserved for historical reason, must be
zero
1-7 reserved, must be zero
CX = number of words to copy from protected mode to
real mode stack
ES:(E)DI= selector:offset of real mode register data
structure in the following format:
Offset Length Contents
00H 4 DI or EDI
04H 4 SI or ESI
08H 4 BP or EBP
0CH 4 reserved, ignored
10H 4 BX or EBX
14H 4 DX or EDX
18H 4 CX or ECX
1CH 4 AX or EAX
20H 2 CPU status flags
22H 2 ES
24H 2 DS
26H 2 FS
28H 2 GS
2AH 2 IP
2CH 2 CS
2EH 2 SP
30H 2 SS
Returns:
if function successful
Carry flag= clear
ES:(E)DI= selector:offset of modified real mode register
data structure
if function unsuccessful
Carry flag= set
AX = error code
8012H linear memory unavailable (stack)
8013H physical memory unavailable (stack)
8014H backing store unavailable (stack)
8021H invalid value (CX too large)
Notes:
o 32-bit programs must use ES:EDI to point to the real mode
register data structure. 16-bit programs should use
ES:DI.
o The CS:IP in the real mode register data structure
specifies the address of the real mode procedure to call.
o If the SS:SP fields in the real mode register data
structure are zero, a real mode stack will be provided by
the DPMI host. Otherwise, the real mode SS:SP will be
set to the specified values before the interrupt handler
is called.
o Values placed in the segment register positions of the
data structure must be valid for real mode; i.e. the
values must be paragraph addresses and not selectors.
o All general register fields in the data structure are
DWORDs so that 32-bit registers can be passed to real
mode. Note, however, that 16-bit hosts are not required
to pass the high word of 32-bit general registers or the
FS and GS segment registers to real mode even when
running on an 80386 or later CPU.
o The target real mode procedure must return with the stack
in the same state as when it was called. This means that
the real mode code may switch stacks while it is running,
but must return on the same stack that it was called on
and must exit with a RETF (far return) and should not
clear the stack of any other parameters that were passed
to it on the stack.
o When this function returns, the real mode register data
structure will contain the values that were returned by
the real mode procedure.
o It is the caller's responsibility to remove any
parameters that were pushed on the protected mode stack.
Int 31H Function 0302H [0.9]
Call Real Mode Procedure With IRET Frame
Simulates a FAR CALL w
ith flags pushed on the stack to a real mode procedure. The
real mode routine must return by executing an IRET
instruction.
Call With:
AX = 0302H
BH = flags
Bit Significance
0 reserved for historical reason, must be
zero
1-7 reserved, must be zero
CX = number of words to copy from protected mode to
real mode stack
ES:(E)DI= selector:offset of real mode register data
structure in the following format:
Offset Length Contents
00H 4 DI or EDI
04H 4 SI or ESI
08H 4 BP or EBP
0CH 4 reserved, ignored
10H 4 BX or EBX
14H 4 DX or EDX
18H 4 CX or ECX
1CH 4 AX or EAX
20H 2 CPU status flags
22H 2 ES
24H 2 DS
26H 2 FS
28H 2 GS
2AH 2 IP
2CH 2 CS
2EH 2 SP
30H 2 SS
Returns:
if function successful
Carry flag= clear
ES:(E)DI= selector:offset of modified real mode register
data structure
if function unsuccessful
Carry flag= set
AX = error code
8012H linear memory unavailable (stack)
8013H physical memory unavailable (stack)
8014H backing store unavailable (stack)
8021H invalid value (CX too large)
Notes:
o 32-bit programs must use ES:EDI to point to the real mode
register data structure. 16-bit programs should use
ES:DI.
o The CS:IP in the real mode register data structure
specifies the address of the real mode procedure to call.
o If the SS:SP fields in the real mode register data
structure are zero, a real mode stack will be provided by
the DPMI host. Otherwise, the real mode SS:SP will be
set to the specified values before the interrupt handler
is called.
o The flags specified in the real mode register data
structure will be pushed on the real mode stack's IRET
frame. The procedure will be called with the interrupt
and trace flags clear.
o Values placed in the segment register positions of the
data structure must be valid for real mode; i.e. the
values must be paragraph addresses and not selectors.
o All general register fields in the data structure are
DWORDs so that 32-bit registers can be passed to real
mode. Note, however, that 16-bit hosts are not required
to pass the high word of 32-bit general registers or the
FS and GS segment registers to real mode even when
running on an 80386 or later CPU.
o The target real mode handler or procedure must return
with the stack in the same state as when it was called.
This means that the real mode code may switch stacks
while it is running, but must return on the same stack
that it was called on and must return with an IRET or
discard the flags from the stack with a RETF(2) .
o When this function returns, the real mode register data
structure will contain the values that were returned by
the real mode procedure.
o It is the caller's responsibility to remove any
parameters that were pushed on the protected mode stack.
Int 31H Function 0303H [0.9]
Allocate Real Mode Callback Address
Returns a unique real mode segment:offset, known as a "real
mode callback," that will transfer control from real mode
to a protected mode procedure. Callback addresses obtained
with this function can be passed by a protected mode program
to a real mode application, interrupt handler, device
driver, or TSR, so that the real mode program can call
procedures within the protected mode program or notify the
protected mode program of an event.
Call With:
AX = 0303H
DS:(E)SI= selector:offset of protected mode procedure to
call
ES:(E)DI= selector:offset of 32H-byte buffer for real
mode register data structure to be used when
calling callback routine.
Returns:
if function successful
Carry flag= clear
CX:DX = segment:offset of real mode callback
if function unsuccessful
Carry flag= set
AX = error code
8015H callback unavailable
Notes:
o DPMI hosts must provide a minimum of 16 callback
addresses per client.
o A descriptor may be allocated for each callback to hold
the real mode SS descriptor. Real mode callbacks are a
limited system resource. A client should use the Free
Real Mode Callback Address function (Int 31H Function
0304H) to release a callback that it is no longer using.
o For further information on writing real mode callback
procedures, see page 34.
o The contents of the real mode register data structure is
not valid after the function call, but only at the time
of the actual callback.
Int 31H Function 0304H [0.9]
Free Real Mode Callback Address
Releases a real mode callback address that was previously
allocated with the Allocate Real Mode Callback Address
function (Int 31H Function 0303H).
Call With:
AX = 0304H
CX:DX = real mode callback address to be freed
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8024H invalid callback address
Notes:
o Real mode callbacks are a limited system resource. A
client should release any callback that it is no longer
using.
Int 31H Function 0305H [0.9]
Get State Save/Restore Addresses
Returns the addresses of two procedures used to save and
restore the state of the current task's registers in the
mode which is not currently executing.
Call With:
AX = 0305H
Returns:
Carry flag = clear (this function always succeeds)
AX = size of buffer in bytes required to save state
BX:CX = real mode address of routine used to
save/restore state
SI:(E)DI= protected mode address of routine used to
save/restore state
Notes:
o The real mode address returned by this function in BX:CX
is called only in real mode to save/restore the state of
the protected mode registers. The protected mode address
returned by this function in SI:(E)DI is called only in
protected mode to save/restore the state of the real mode
registers; 16-bit programs should call the address in
SI:DI, 32-bit programs should call the address in SI:EDI.
Registers for the current mode can be saved by simply
pushing them on the stack.
o Both of the state-save procedures are entered by a FAR
CALL with the following parameters:
AL = 0 to save state
= 1 to restore state
ES:(E)DI= (selector or segment):offset of state-save buffer
The state-save buffer must be at least as large as the value returned
in AX by Int 31H Function 0305H. The state save/restore
procedures do not modify any registers. For a further
discussion of use of the state save/restore procedures,
see page 25.
o Some DPMI hosts will not require the state to be saved,
indicating this by returning a buffer size of zero in AX.
In such cases, the addresses returned by this function
can still be called, although they will simply return
without performing any useful function.
o Clients do not need to call the state save/restore
procedures before using Int 31H Functions 0300H, 0301H,
or 0302H. The state save/restore procedures are provided
specifically for clients that use the raw mode switch
services.
o A client can use the function to save its state in the
destination mode before switching modes using the raw
mode switch or issuing real-mode calls from a protected
mode hardware interrupt handler. Refer to page 24 for the
detailed information on stacks and mode switching.
Int 31H Function 0306H [0.9]
Get Raw Mode Switch Addresses
Returns addresses that can be called for low-level mode
switching.
Call With:
AX = 0306H
Returns:
Carry flag = clear (this function always succeeds)
BX:CX = real-to-protected mode switch address
SI:(E)DI= protected-to-real mode switch address
Notes:
o The address returned in BX:CX must only be called in real
mode to switch into protected mode. The address returned
in SI:(E)DI must only be called in protected mode to
switch into real mode; 16-bit programs should call the
address returned by this function in SI:DI, while 32-bit
programs should call the address returned in SI:EDI.
o The mode switch procedures are entered by a FAR JMP to
the appropriate address with the following parameters:
AX = new DS
CX = new ES
DX = new SS
(E)BX= new (E)SP
SI = new CS
(E)DI= new (E)IP
The processor is placed into the desired mode, and the DS, ES, SS,
(E)SP, CS, and (E)IP registers are updated with the
specified values; in other words, execution of the client
continues in the requested mode at the address provided
in registers SI:(E)DI. The values specified to be placed
into th
e segment registers must be appropriate for the destination mode; if
invalid selectors are supplied when switching into
protected mode, an exception will occur.
The values in (E)AX, (E)BX, (E)CX, (E)DX, (E)SI, and (E)DI after the
mode switch are undefined. (E)BP will be preserved across
the mode switch call so it can be used as a pointer. On
an 80386 or later CPU, the FS and GS segment registers
will contain zero after the mode switch.
If interrupts are disabled when the mode switch procedure is invoked,
they will not be re-enabled by the DPMI host (even
temporarily).
o It is up to the client to save and restore the state of
the task when using this function to switch modes. This
usually requires using the state save/restore procedures
whose addresses are returned by Int 31H Function 0305H
(see page 94).
o Clients may find it more convenient to use Int 31H
Functions 0300H, 0301H, and 0302H for mode switching than
this function.
Int 31H Function 0400H [0.9]
Get Version
Returns the version number of the DPMI Specification
implemented by the DPMI host. Clients can use this
information to determine which function calls are supported
in the current environment.
Call With:
AX = 0400H
Returns:
Carry flag= clear (this function always succeeds)
AH = DPMI major version as a binary number
AL = DPMI minor version as a binary number
BX = flags
Bits Significance
0 0 = host is 16-bit DPMI implementation
1 = host is 32-bit (80386) DPMI
implementation
1 0 = CPU returned to Virtual 86 mode for
reflected interrupts
1 = CPU returned to real mode for
reflected interrupts
2 0 = virtual memory not supported
1 = virtual memory supported
3 reserved, for historical reasons
4-15 reserved for later use
CL = processor type
02H = 80286
03H = 80386
04H = 80486
05H-FFH reserved for future Intel
processors
DH = current value of virtual master PIC base
interrupt
DL = current value of virtual slave PIC base
interrupt
Notes:
o Under DPMI hosts, the major version number is returned in
DH and the minor version number is returned in DL. There
are two decimal digits for the minor version number with
the least-significant digit representing the revision
number of the minor version number. Under DPMI version
0.9 hosts, DH is returned as 0, and DL is returned as
decimal 90 (5AH). In hypothetical DPMI version 2.3, DH
would be returned as 2 and DL would be returned as 30
(1EH).
Int 31H Function 0401H [1.0]
Get DPMI Capabilities
Returns information about the capabilities of the DPMI host,
including its support or lack of support for optional
features in the DPMI Specification. Clients can use this
information to optimize their use of system resources in the
current environment.
Call With:
AX = 0401H
ES:(E)DI= selector:offset of 128-byte buffer
Returns:
if function successful
Carry flag= clear (this function always succeeds in DPMI
1.0)
AX = capabilities flags
Bits Significance
0 0 = PAGED ACCESSED/DIRTY capability not
supported
1 = PAGED ACCESSED/DIRTY capability
supported
1 0 = EXCEPTIONS RESTARTABILITY capability
not supported
1 = EXCEPTIONS RESTARTABILITY capability
supported
2 0 = DEVICE MAPPING capability not
supported
1 = DEVICE MAPPING capability supported
3 0 = CONVENTIONAL MEMORY MAPPING
capability not supported
1 = CONVENTIONAL MEMORY MAPPING
capability supported
4 0 = DEMAND ZERO-FILL capability not
supported
1 = DEMAND ZERO-FILL capability supported
5 0 = WRITE-PROTECT CLIENT capability not
supported
1 = WRITE-PROTECT CLIENT capability
supported
6 0 = WRITE-PROTECT HOST capability not
supported
1 = WRITE-PROTECT HOST capability
supported
7-15 reserved
CX = reserved, must be 0
DX = reserved, must be 0
ES:(E)DI = selector:offset of 128-byte buffer filled in
by host with information as follows:
Offset Length Contents
0 1 Host major version number as a
decimal number
1 1 Host minor version number as a
decimal number
2 1-126 ASCIIZ (null-terminated) string
identifying the DPMI host
vendor
if function unsuccessful
Carry flag= set (this function always fails in DPMI 0.9)
Notes:
o PAGE ACCESSED/DIRTY capability means the DPMI host
maintains page dirty and accessed bits that can be read
and written with the Get and Set Page Attributes
functions (Int 31H Functions 0506H and 0507H). This
capability must be supported, and must read and write the
hardware-level dirty and accessed bits, if the DPMI host
does not provide demand-paged virtual memory. If the
DPMI host does support virtual memory, this capability is
optional, and if present gives the client the ability to
read and write virtual page dirty and accessed bits
maintained by the host.
o EXCEPTION RESTARTABILITY capability means that a faulting
instruction inside the host kernel can always be
restarted if the client's exception handler corrects the
reason for the exception and returns. Exception
restartability allows a client to provide virtual memory
under a DPMI host without virtual memory, or to support
memory-mapped files under any DPMI host.
o DEVICE MAPPING capability means that the DPMI host
supports the optional Map Device function (Int 31H
Function 0508H).
o CONVENTIONAL MEMORY MAPPING capability means that the
DPMI host supports the optional Map Conventional Memory
function (Int 31H Function 0509H).
o DEMAND ZERO-FILL capability means the DPMI host
guarantees that all committed pages are initialized to
zero when they are created. If this capability is not
supported, the contents of newly committed pages are
undefined.
o WRITE-PROTECT CLIENT capability means the DPMI host
guarantees that the client is running at a privilege
level such that write protection of pages is effective
for the client's accesses and will geneate page faults.
o WRITE-PROTECT HOST capability means the DPMI host
guarantees that the host has configured the system such
that write protection of pages is effective for the
host's accesses and will generate page faults.
o The host major and minor version numbers are OEM-specific
and are not the DPMI version numbers.
Int 31H Function 0500H [0.9]
Get Free Memory Information
Returns information about the amount of available physical
memory, linear address space, and disk space for page
swapping. Since DPMI clients will often run in multitasking
environments, the information returned by this function
should only be considered as advisory. DPMI 1.0 clients
should avoid use of this function (see the last note of the
call).
Call With:
AX = 0500H
ES:(E)DI= selector:offset of 48-byte buffer
Returns:
Carry flag= clear (this function always succeeds)
and the buffer is filled in with the following
information:
Offset Length Contents
00H 4 Largest available free block in bytes
04H 4 Maximum unlocked page allocation in pages
08H 4 Maximum locked page allocation in pages
0CH 4 Linear address space size in pages
10H 4 Total number of unlocked pages
14H 4 Total number of free pages
18H 4 Total number of physical pages
1CH 4 Free linear address space in pages
20H 4 Size of paging file/partition in pages
24H 0CH Reserved, all bytes set to 0FFH
Notes:
o 32-bit programs must use ES:EDI to point to the buffer.
16-bit programs should use ES:DI.
o Only the first field of the returned structure is
guaranteed to contain a valid value. Any fields that are
not supported by the DPMI host will be set by the host to
-1 (0FFFFFFFFH) to indicate that the information is not
available.
o The field at buffer offset 00H specifies the largest
block of contiguous linear memory in bytes that could be
allocated if the memory were to be allocated and left
unlocked.
o The field at buffer offset 04H specifies the largest
number of pages that could be allocated (the value at
offset 00H divided by the page size).
o The field at buffer offset 08H specifies the largest
block of memory in pages that could be allocated and then
locked.
o The field at buffer offset 0CH specifies the size of the
total linear address space in pages. This value includes
all linear address space that has already been allocated.
o The field at buffer offset 10H specifies the total number
of pages that are currently un
locked and could be paged out. This value also contains any free
pages.
o The field at buffer offset 14H specifies the number of
physical pages that currently are not in use.
o The field at offset 18H specifies the total number of
physical pages that the DPMI host manages. This value
includes all free, locked, and unlocked physical pages.
o The field at offset 20H specifies the size of the DPMI
host's paging partition or file in pages.
o The size of the pages used by the DPMI host can be
obtained with the Get Page Size function (Int 31H
Function 0604H).
o DPMI 1.0 clients should use Int 31H Function 050BH in
preference to this function. This function is supported
in DPMI 1.0 solely for backward compatibility with DPMI
0.9.
Int 31H Function 0501H [0.9]
Allocate Memory Block
Allocates and commits a block of linear memory.
Call With:
AX = 0501H
BX:CX = size of block (bytes, must be nonzero)
Returns:
if function successful
Carry flag= clear
BX:CX = linear address of allocated memory block
SI:DI = memory block handle (used to resize and free
block)
if function unsuccessful
Carry flag= set
AX = error code
8012H linear memory unavailable
8013H physical memory unavailable
8014H backing store unavailable
8016H handle unavailable
8021H invalid value (BX:CX = 0)
Notes:
o The allocated block is guaranteed to have at least
paragraph alignment.
o This function always creates committed pages.
o This function does not allocate any descriptors for the
memory block. It is the responsibility of the client to
allocate and initialize any descriptors needed to access
the memory with additional DPMI function calls.
o Under DPMI hosts that support virtual memory, the memory
block will be allocated unlocked. The client can lock
some or all of the memory after it is allocated with the
Lock Linear Region function (Int 31H Function 0600H).
o Under many DPMI hosts, allocations by this function are
page granular. This means, for example, that if the DPMI
host uses a page size of 4 KB (1000H), an allocation of
1001H bytes will actually result in an allocation of
2000H bytes. Therefore, it is best to always allocate
memory in multiples of the unit of granularity (under
DPMI 0.9, use 4K bytes), which can be obtained with Int
31H Function 0604H.
Int 31H Function 0502H [0.9]
Free Memory Block
Frees a memory block that was previously allocated with
either the Allocate Memory Block function (Int 31H Function
0501H) or the Allocate Linear Memory Block function (Int 31H
Function 0504H).
Call With:
AX = 0502H
SI:DI = memory block handle
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8023H invalid handle
Notes:
o This call will correctly free all of the possible page
types that can occur in a memory block: committed pages,
uncommitted pages, and mapped pages (see Appendix A:
Glossary).
o No descriptors are freed by this call. It is the
client's responsibility to free any descriptors that it
previously allocated to map the memory block.
Descriptors should be freed before linear memory blocks.
Int 31H Function 0503H [0.9]
Resize Memory Block
Changes the size of a memory block that was previously
allocated with either the Allocate Memory Block function
(Int 31H Function 0501H) or the Allocate Linear Memory Block
function (Int 31H Function 0504H).
Call With:
AX = 0503H
BX:CX = new size of block (bytes, must be nonzero)
SI:DI = memory block handle
Returns:
if function successful
Carry flag= clear
BX:CX = new linear address of memory block
SI:DI = new handle for memory block
if function unsuccessful
Carry flag= set
AX = error code
8012H linear memory unavailable
8013H physical memory unavailable
8014H backing store unavailable
8016H handle unavailable
8021H invalid value (BX:CX = 0)
8023H invalid handle (in SI:DI)
Notes:
o After this function returns, the previous handle for the
memory block is invalid and should not be used.
o When increasing the size of a block, this function always
creates committed pages. When decreasing the block size,
this call will correctly free all possible page types
(committed pages, uncommitted pages, and mapped pages).
The linear address and handle of the memory block may
change as a result of this call.
o It is the client's responsibility to update any
descriptors that map the memory block with the new linear
address after resizing the block.
o This function returns an error if the client attempts to
resize a memory block to zero bytes.
Int 31H Function 0504H [1.0]
Allocate Linear Memory Block
Allocates a block of page-aligned linear address space. The
base address of the block may be specified by the client,
and pages within the block may be committed or uncommitted.
Call With:
AX = 0504H
EBX = desired page-aligned linear address of memory
block,
or zero if linear address unspecified
ECX = size of block (bytes, must be nonzero)
EDX = flags
Bit Significance
0 0 = create uncommitted pages
1 = create committed pages
1-31 reserved, should be zero
Returns:
if function successful
Carry flag= clear
EBX = linear address of memory block
ESI = handle for memory block
if function unsuccessful
Carry flag= set
AX = error code
8001H unsupported function (16-bit host)
8012H linear memory unavailable
8013H physical memory unavailable
8014H backing store unavailable
8016H handle unavailable
8021H invalid value (ECX = 0)
8025H invalid linear address (EBX not page
aligned)
Notes:
o A DPMI 1.0 host that is 16-bit only will not support this
function.
o A 16-bit client of a 32-bit DPMI 1.0 host can use this
function.
o The allocated block is always page-aligned. If a
specific linear address is not requested (EBX = 0), the
DPMI host allocates the memory block at any available
page-aligned linear address. If a specific linear
address is requested (EBX nonzero), the host either
allocates the block at the specified address or returns
error code 8012H (linear memory unavailable).
o Int 31H Function 0501H, which can also be used to
allocate linear memory blocks, does not necessarily
page-align its blocks and does not have the ability to
create uncommitted pages or allocate a block at a
specific linear address.
Int 31H Function 0505H [1.0]
Resize Linear Memory Block
Changes the size of a memory block that was previously
allocated with the Allocate Linear Memory Block function
(Int 31H Function 0504H).
Call With:
AX = 0505H
ESI = memory block handle
ECX = new block size (bytes, must be nonzero)
EDX = flags
Bit Significance
0 0 = create uncommitted pages
1 = create committed pages
1 0 = do not update segment descriptors
1 = segment descriptor update required
2-31 reserved, must be zero
and, if bit 1 of EDX is set (1):
ES:EBX = selector:offset of a buffer containing an array
of selectors, 1 word (16 bits) per selector
EDI = count of selectors in array
Returns:
if function successful
Carry flag= clear
EBX = new linear base address of memory block
ESI = new handle for memory block
if function unsuccessful
Carry flag= set
AX = error code
8001H unsupported function (16-bit host)
8012H linear memory unavailable
8013H physical memory unavailable
8014H backing store unavailable
8016H handle unavailable
8021H invalid value (ECX=0)
8023H invalid handle (in ESI)
Notes:
o A DPMI 1.0 host that is 16-bit only will not support this
function.
o A 16-bit client of a 32-bit DPMI 1.0 host can use this
function.
o After this function returns, the previous handle for the
memory block is invalid and should not be used.
o If this function fails, the block's size and base address
are always unmodified.
o If the size of the block is increased, the new pages are
committed or uncommitted according to the value of bit 0
of EDX, and the block's linear base address may change.
If the size of the block is decreased, pages at the end
of the block are freed, and the block's base address is
always unchanged.
o If the block's linear base address is changed by this
function, and the function was called with bit 1 of EDX
set (1), the DPMI host updates the descriptors f
or each of the segments in the update list which fall within the
memory block. Descriptors for segments which do not fall
within the memory block are not modified. Expand-up
segments fall within the memory block if the segment base
is within the block. Expand-down segments fall within
the memory block if the (segment base + the limit - 1) is
within the block. In either case, the segment base is
modified by the distance the block moves, and the segment
limit is not changed. The moving of the memory block and
the updating of descriptors is performed atomically; i.e.
the host will not deliver any hardware interrupts to the
client during the update.
o Int 31H Function 0503H, which also resizes linear memory
blocks, does not necessarily page-align blocks and cannot
create uncommitted pages or update descriptors.
Int 31H Function 0506H [1.0]
Get Page Attributes
Returns the attributes of one or more pages within a linear
memory block previously allocated with Int 31H Function
0504H.
Call With:
AX = 0506H
ESI = memory block handle
EBX = base offset in memory block of page (or of first
page, if requesting attributes for multiple
pages)
ECX = number of pages
ES:EDX = selector:offset of a buffer to receive page
attributes, 1 word (16-bits) per page (see Note)
Returns:
if function successful
Carry flag= clear
and buffer at ES:EDX filled in with page attributes (see
Note)
if function unsuccessful
Carry flag= set
AX = error code
8001H unsupported function (16-bit host)
8023H invalid handle (in ESI)
8025H invalid linear address (Specified range
is not within specified block)
Notes:
o A DPMI 1.0 host that is 16-bit only will not support this
function.
o A 16-bit client of a 32-bit DPMI 1.0 host can use this
function.
o If EBX is not aligned, it will be rounded down to the
next lower page boundary.
o The specified buffer is filled in by the DPMI host with
the attributes of the requested pages, 1 word (16-bits)
per page, in the following format:
Bits Significance
0-2 page type (0-7)
Value Meaning
0 uncommitted page
1 committed page
2 mapped page
3-7 currently unused
3 0 = page is read-only
1 = page is read/write
4 0 = accessed/dirty bits not available for this
page
1 = accessed/dirty bits are supplied for this
page in bits 5-6
5 0 = page has not been accessed (if bit 4=1)
1 = page has been accessed (if bit 4=1)
6 0 = page has not been modified (if bit 4=1)
1 = page has been modified (if bit 4=1)
7-15 reserved, currently zero
o Mapped pages can only occur in memory blocks under DPMI
hosts that support the Device Mapping capability or the
Conventional Memory Mapping capability. See Int 31H
Functions 0401H, 0508H, and 0509H.
o The dirty and accessed bits are only supplied if the DPMI
host supports the Page Accessed/Dirty capability. DPMI
hosts that support this capability are required to return
dirty and accessed bits for all committed pages and for
mapped pages created with the Map Conventional Memory
call (Int 31H Function 0509H). However, dirty and
accessed bits may not be returned for individual mapped
pages created with the Map Device call (Int 31H Function
0508H) if the host is using page table entries (PTEs) to
virtualize the device.
Int 31H Function 0507H [1.0]
Set Page Attributes
Sets the attributes of one or more pages within a linear
memory block previously allocated with Int 31H Function
0504H. This function can be used to change a committed page
or a mapped page to an uncommitted page, change an
uncommitted page or a mapped page to a committed page, or
modify the read/write bit and optionally the accessed and
dirty bits on a committed or mapped page.
Call With:
AX = 0507H
ESI = memory block handle
EBX = offset within memory block of page(s) whose
attributes are to be modified
ECX = number of pages
ES:EDX = selector:offset of a buffer containing page
attributes, 1 word (16-bits) per page (see Note)
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8001H unsupported function (16-bit host)
8002H invalid state (page in wrong state for
request)
8013H physical memory unavailable
8014H backing store unavailable
8021H invalid value (illegal request in bits
0-2 of one or more page attribute words)
8023H invalid handle (in ESI)
8025H invalid linear address (specified range
is not within specified block)
ECX = number of pages that have been set
Notes:
o A DPMI 1.0 host that is 16-bit only will not support this
function.
o A 16-bit client of a 32-bit DPMI 1.0 host can use this
function.
o If EBX is not aligned, it will be rounded down to the
next lower page boundary.
o An uncommitted page can be created from:
a committed page, by releasing the physical memory or
backing store allocated to the page;
a mapped page, by marking it uncommitted; or
an uncommitted page, by doing nothing.
o A committed page can be created from:
an uncommitted page or mapped page, by allocating
physical memory or backing store (with undefined, or
zero-filled contents) for the page; or
a committed page, by doing nothing (page contents
unmodified).
o The attribute word (16-bits) specified for a page has the
following format (bits 3-6 are only relevant if page is
being created committed or its attributes are being
modified, i.e. the value in bits 0-2 of the page
attribute is 1 or 3):
Bits Significance
0-2 page type (0-7)
Value Meaning
0 create page uncommitted
1 create page committed
2 not allowed
3 modify attributes without changing page
type
4-7 not allowed
3 0 = page is read-only
1 = page is read/write
4 0 = don't modify accessed/dirty bits for page
1 = set accessed/dirty bits as specified in
bits 5-6
5 0 = mark page as not accessed (if bit 4=1)
1 = mark page as accessed (if bit 4=1)
6 0 = mark page as not dirty (if bit 4=1)
1 = mark page as dirty (if bit 4=1)
7-15 reserved, should be zero
o This function, and the optional Map Device and Map
Conventional Memory functions (Int 31H Functions 0508H
and 0509H), are the only means of changing the type of a
page within an existing memory block.
o The page read/write bit, and optionally the accessed and
dirty bits, can be modified on an existing committed or
mapped page, or on a committed page when it is initially
created from an uncommitted page or a mapped page.
However, the accessed and dirty bits are ignored if the
host does not support the Page Accessed/Dirty capability.
See Int 31H Function 0401H.
o Visible page faults (page faults that can be serviced by
a client-installed exception handler) can only occur for
uncommitted pages or read-only pages (for definitions of
transparent page fault and visible page fault, see
Appendix A: Glossary).
Int 31H Function 0508H [Optional] [1.0]
Map Device in Memory Block
Maps the physical addresses assigned to a device onto the
linear addresses of a memory block previously allocated with
Int 31H Function 0504H.
Call With:
AX = 0508H
ESI = memory block handle
EBX = offset within memory block of page(s) to be
mapped (must be page-aligned)
ECX = number of pages to map
EDX = physical address of device (must be
page-aligned)
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8001H unsupported function (Device Mapping
Capability not supported)
8003H system integrity (invalid device address)
8023H invalid handle (in ESI)
8025H invalid linear address (specified range
is not within specified block or EBX/EDX
is not page-aligned)
Notes:
o 16-bit DPMI hosts will not support this function. A
16-bit client of a 32-bit DPMI 1.0 host can use this
function.
o Support of this call by 32-bit DPMI hosts is optional.
Application programs or DOS Extenders which require this
call in order to run are not DPMI Compliant.
o Any committed or mapped pages resided in the linear
address range that is being mapped into will be
uncommitted or unmapped automatically by the host.
o All pages created by this call have the mapped bit (bit
2) set in the attributes returned by the Get Page
Attributes function (Int 31H Function 0506H).
o This functio
n differs from the Create Physical Address Mapping function (Int 31H
Function 0800H) in that this function supports mapping of
physical devices within an existing memory block, rather
than at an arbitrary linear address. Use of an existing
memory block gives 32-bit programs the ability to access
physical devices with NEAR pointers, which is often
highly desirable for performance reasons.
o Unlike Int 31H Function 0800H, this function allows
mapping of addresses below 1 MB that do not lie within
RAM available for use by programs; e.g. this function can
be used to map the refresh buffers of IBM-compatible
display adapters.
o If the DPMI host is not virtualizing the device, it must
disable any memory caching on the mapped pages; in
particular, on the 486 or later, the PCD (page cache
disable) bit must be set in the page table entries.
o DPMI hosts that do not virtualize physical devices can
support this function by creating page table entries that
map the physical device. The page table entries must be
marked as mapped so that the host knows not to attempt
freeing of physical memory for the pages when the memory
block is freed.
o DPMI hosts are allowed to support this function for some
physical devices and not for others, because mapping of
virtualized devices requires page aliasing in the host -
a complex task. DPMI hosts with partial support for this
function may fail the function call on virtualized
devices (such as displays), and allow the call on
non-virtualized devices (such as the Weitek
coprocessors). Allowing the client to map a physical
device so that it can be accessed with NEAR references,
for example, may help the client achieve considerably
better performance.
Int 31H Function 0509H [Optional] [1.0]
Map Conventional Memory in Memory Block
Aliases linear addresses below the 1 MB boundary onto the
linear addresses of a memory block previously allocated with
Int 31H Function 0504H.
Call With:
AX = 0509H
ESI = memory block handle
EBX = offset within memory block of page(s) to be
mapped (must be page-aligned)
ECX = number of pages to map
EDX = linear address of conventional memory (must be
page-aligned)
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8001H unsupported function (Conventional Memory
Mapping Capability not supported)
8003H system integrity (invalid conventional
memory address)
8023H invalid handle (in ESI)
8025H invalid linear address (specified range
is not within specified block, or EBX/EDX
is not page aligned)
Notes:
o 16-bit DPMI hosts will not support this function. A
16-bit client of a 32-bit DPMI 1.0 host can use this
function.
o Support of this call by 32-bit DPMI hosts is optional.
Application programs or DOS Extenders which require this
call in order to run are not DPMI Compliant.
o Any committed or mapped pages resided in the linear
address range that is being mapped into will be
uncommitted or unmapped automatically by the host.
o A client may only map conventional memory that it already
owns; i.e. memory which the client previously allocated
with Int 31H Function 0100H or by calling DOS's Int 21H
Function 48H directly via the translation services.
o All pages created by this call have the mapped bit (bit
2) set in the attributes returned by the Get Page
Attributes function (Int 31H Function 0506H).
o DPMI hosts that do not implement virtual memory can
support this function by simply copying page table
entries. The entries must be marked as mapped so that
the host knows not to free up those physical pages when
the memory block is freed.
o DPMI hosts that provide virtual memory must implement
some form of page aliasing in order to support this
function.
o The function can provide a large contiguous memory space
without virtual memory support.
Implementors of DPMI hosts which do not provide virtual
memory are encouraged to support this function. Without
this function, conventional memory may be inaccessible to
a 32-bit nonsegmented client, because the client may need
contiguous linear memory for its code and data. 32-bit
clients can always guarantee that conventional memory is
not wasted with the following strategy:
Call DOS to allocate any free conventional memory
If the DPMI host supports virtual memory, call the Mark
Real Mode Region Pageable function (Int 31H Function
0602H) to ensure that the host has not locked down
conventional memory.
If the host does not support virtual memory but supports
the Map Conventional Memory function (Int 31H Function
0509H), allocate a memory block with uncommitted pages,
then use Function 0509H to make the physical memory
allocated below 640 KB addressable in the memory block,
and therefore useable by the 32-bit application program.
Int 31H Function 050AH [1.0]
Get Memory Block Size and Base
Returns the size of a memory block that was previously
allocated with Int 31H Function 0501H or 0504H.
Call With:
AX = 050AH
SI:DI = memory block handle
Returns:
if function successful
Carry flag= clear
SI:DI = size of memory block (bytes)
BX:CX = base address of memory block if function
unsuccessful
Carry flag= set
AX = error code
8023H invalid handle
Int 31H Function 050BH [1.0]
Get Memory Information
Returns information about available physical and virtual
memory. Since DPMI clients will often run in multitasking
environments, some of information related to shared
resources returned by this function should only be
considered as advisory.
Call With:
AX = 050BH
ES:(E)DI= selector:offset of 128-byte buffer
Returns:
if function successful
Carry flag= clear (this function always succeeds in DPMI
1.0)
and the buffer pointed to by ES:(E)DI is filled in with
the following information:
Offset Length Contents
00H 4 Total allocated bytes of physical memory
controlled by DPMI host
04H 4 Total allocated bytes of virtual memory
controlled by DPMI host
08H 4 Total available bytes of virtual memory
controlled by DPMI host
0CH 4 Total allocated bytes of virtual memory
for this virtual machine
10H 4 Total available bytes of virtual memory
for this virtual machine
14H 4 Total allocated bytes of virtual memory
for this client
18H 4 Total available bytes of virtual memory
for this client
1CH 4 Total locked bytes of memory for this
client
20H 4 Maximum locked bytes of memory for this
client
24H 4 Highest linear address available to this
client
28H 4 Size in bytes of largest available free
memory block
2CH 4 Size of minimum allocation unit in bytes
30H 4 Size of the allocation alignment unit in
bytes
34H 4CH Reserved, currently zero
if function unsuccessful
Carry flag= set (this function always fails in DPMI 0.9)
Notes:
o DPMI 1.0 clients should use this function in preference
to Int 31H Function 0500H.
o The "total available bytes" field of the data structure
pointed by ES:(E)DI means the total bytes minus all of
the allocated bytes.
Int 31H Function 0600H [0.9]
Lock Linear Region
Locks the specified linear address range.
Call With:
AX = 0600H
BX:CX = starting linear address of memory to lock
SI:DI = size of region to lock (bytes)
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8013H physical memory unavailable
8017H lock count exceeded
8025H invalid linear address (unallocated
pages)
Notes:
o If the function returns an error, none of the memory has
been locked.
o If the specified region overlaps part of a page at the
beginning or end of the region, the page(s) will be
locked.
o This function may be called more than once for a given
page; the DPMI host maintains a lock count for each page.
o This function is ignored by DPMI implementations that do
not support virtual memory; the function will return the
Carry flag clear to indicate success, but has no other
effect. DPMI hosts which support virtual memory may also
choose to ignore this function, but such hosts must be
able to handle page faults transparently at arbitrary
points during a client's execution, including within
interrupt and exception handlers.
Int 31H Function 0601H [0.9]
Unlock Linear Region
Unlocks a linear address range that was previously locked
using the Lock Linear Region function (Int 31H Function
0600H).
Call With:
AX = 0601H
BX:CX = starting linear address of memory to unlock
SI:DI = size of region to unlock (bytes)
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8002H invalid state (page not locked)
8025H invalid linear address (unallocated
pages)
Notes:
o If the function returns an error, none of the memory has
been unlocked.
o If the specified region overlaps part of a page at the
beginning or end of the region, the page(s) will be
unlocked.
o A lock count is maintained for each locked page; the page
is not unlocked until the lock count is decremented to
zero (i.e. the number of Lock Region Int 31H Function
0600H calls has been balanced by the same number of
Unlock Region Int 31H Function 0601H calls).
o This function is ignored by DPMI implementations that do
not support virtual memory; the function will return the
Carry flag clear to indicate success, but has no other
effect. DPMI hosts which support virtual memory may also
choose to ignore this function, but such hosts must be
able to handle page faults transparently at arbitrary
points during a client's execution, including within
interrupt and exception handlers.
Int 31H Function 0602H [0.9]
Mark Real Mode Region as Pageable
Advises the DPMI host that the specified memory below the 1
MB boundary may be paged to disk.
Call With:
AX = 0602H
BX:CX = starting linear address of memory to mark as
pageable
SI:DI = size of region to be marked (bytes)
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8002H invalid state (region already marked as
pageable)
8025H invalid linear address (region is above 1
MB boundary)
Notes:
o If the function returns an error, none of the memory has
been marked as pageable.
o If the specified region overlaps part of a page at the
beginning or end of the region, the page(s) will not be
marked as pageable.
o Pageability information for a real mode region is
maintained as a binary state, not a count. Therefore,
multiple calls to this function for the same region have
no effect.
o For compatibility with DPMI version 0.9 hosts, a client
must call the Relock Real Mode Region function (Int 31H
Function 0603H) to relock the memory region before
terminating. Memory that remains unlocked after the
client has terminated could result in fatal page faults
when another program is executed in the same address
space. DPMI 1.0 hosts automatically relock real mode
memory at client termination.
o Under some DPMI hosts, all conventional memory may be
locked by default. If a protected mode program is using
memory in the first megabyte of address space, it is
recommended that this function be used to turn off
automatic page locking for regions of memory that will
not be touched at interrupt time.
o The client must not mark memory as pageable in regions
that it does not own; i.e. it may only mark as pageable
memory that it has previously allocated with Int 31H
Function 0100H or by a direct call to DOS via the
translation functions. For example, marking all free DOS
memory as pageable under some DPMI hosts could cause a
page fault to occur while inside of DOS, resulting in a
crash. Also, a client should not mark the DPMI host data
area as pageable.
o Note that address space marked as pageable by this
function can still be locked using the Lock Linear Region
function (Int 31H Function 0600H). This function is
just an advisory service to allow memory that does not
need to be locked to be paged out; it disables any
automatic locking of real mode memory performed by the
DPMI host.
o This function is ignored by DPMI implementations that do
not support virtual memory; the function will return the
Carry flag clear to indicate success, but has no other
effect. DPMI hosts which support virtual memory may also
choose to ignore this function, but such hosts must be
able to handle page faults transparently at arbitrary
points during a client's execution, including within
interrupt and exception handlers.
Int 31H Function 0603H [0.9]
Relock Real Mode Region
Relocks a memory region that was previously declared as
pageable with the Mark Real Mode Region as Pageable function
(Int 31H Function 0602H).
Call With:
AX = 0603H
BX:CX = starting linear address of memory to relock
SI:DI = size of region to relock (bytes)
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8002H invalid state (region not marked as
pageable)
8013H physical memory unavailable
8025H invalid linear address (region is above 1
MB boundary)
Notes:
o If the function returns an error, none of the memory has
been relocked.
o If the specified region overlaps part of a page at the
beginning or end of the region, the page(s) will not be
relocked.
o This function is ignored by DPMI implementations that do
not support virtual memory; the function will return the
Carry flag clear to indicate success, but has no other
effect. DPMI hosts which support virtual memory may also
choose to ignore this function, but such hosts must be
able to handle page faults transparently at arbitrary
points during a client's execution, including within
interrupt and exception handlers.
o If Function 0602H is implemented as a "no-operation" on a
particular DPMI host, this function will likewise do
nothing. In other words, this function should not be
used to lock memory, but only to restore the default
state of the host's conventional memory locking.
Int 31H Function 0604H [0.9]
Get Page Size
Returns the size of a single memory page in bytes.
Call With:
AX = 0604H
Returns:
if function successful
Carry flag= clear
BX:CX = page size in bytes
if function unsuccessful
Carry flag= set
AX = error code
8001H unsupported function (16-bit host)
Int 31H Function 0700H [0.9]
Reserved
Function 0700H is reserved for historical reasons and should
not be called.
Int 31H Function 0701H [0.9]
Reserved
Function 0701H is reserved for historical reasons and
should not be called.
Int 31H Function 0702H [0.9]
Mark Page as Demand Paging Candidate
Notifies the DPMI host that a range of pages may be placed
at the head of the page-out candidate list, forcing these
pages to be replaced ahead of other pages even if the memory
has been accessed recently. The contents of the pages will
be preserved.
Call With:
AX = 0702H
BX:CX = starting linear address of pages to mark as
paging candidates
SI:DI = size of region to mark (bytes)
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8025H invalid linear address (range
unallocated)
Notes:
o This function does not force the pages to be swapped to
disk immediately and should be treated as advisory only.
o This function will always succeed on hosts that do not
implement demand-paged virtual memory.
o Partial pages will not be marked.
o This function is useful, for example, if a client knows
that a given piece of data will not be accessed for a
long period of time. That data is ideal for swapping to
disk so that the physical memory it occupies can be used
for other purposes.
Int 31H Function 0703H [0.9]
Discard Page Contents
Discards the entire contents of a given linear memory range.
This function is used when a memory object (such as a data
structure) that occupies a given area of memory is no longer
needed, so that the area will not be paged to disk
unnecessarily. The contents of the discarded region will be
undefined.
Call With:
AX = 0703h
BX:CX = starting linear address of pages to discard
SI:DI = size of region to discard (bytes)
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8025H invalid linear address (range
unallocated)
Notes:
o Partial pages and locked pages will not be discarded.
Int 31H Function 0800H [0.9]
Physical Address Mapping
Converts a physical address into a linear address.
This function allows device drivers running under DPMI
hosts which use paging to reach physical memory that is
associated with their devices above the 1 MB boundary
Examples of such devices are the Weitek numeric coprocessor
(usually mapped at 3 GB), buffers that hold scanner bit
maps, and high-end displays that can be configured to make
display memory appear in extended memory.
Call With:
AX = 0800H
BX:CX = physical address of memory
SI:DI = size of region to map (bytes)
Returns:
if function successful
Carry flag= clear
BX:CX = linear address that can be used to access the
physical memory
if function unsuccessful
Carry flag= set
AX = error code
8003H system integrity (DPMI host memory
region)
8021H invalid value (address is below 1 MB
boundary)
Notes:
o It is the caller's responsibility to allocate and
initialize a descriptor for access to the memory.
o This function should only be used by clients that
absolutely require direct access to a memory mapped
device at physical addresses above 1 MB. Clients should
not use this function to access memory below the 1 MB
boundary (the real mode addressable region). See also
Int 31H Functions 0002H, 0508H, and 0509H.
o When this function is called, the DPMI host either
creates page table entries that directly map the physical
addresses requested and returns the linear address of the
created page table entries, or else just returns the
linear address of the memory region that is already used
to map the requested device. For example, if the client
attempts to map a Weitek coprocessor and the host already
has a linear region set up to map the Weitek chip and
virtualize it, it would simply return the linear address
of the existing region. If the host does not virtualize
the Weitek chip, it would create 16 page table entries
that map the 64 KB Weitek address space and return a
linear address corresponding to the new page table
entries.
o If the host is not virtualizing the device, it must
disable any memory caching on the mapped pages; in
particular, on the 80486 the host must set the PCD (page
cache disable) bit in the page table entries.
o The host is permitted to fail any memory mapping call.
However, the host should support this function whenever
possible, to achieve compatibility with application
programs that use memory-mapped devices of which the host
is not aware. Useful guidelines are that the host should
fail any attempt to map addresses below 1 MB, or
addresses which the host considers to be general-purpose
RAM memory. Attempts to map any other physical address
should succeed, since the host should either (a) already
know about the device and be able to return a linear
address used to access the device, or (b) assume the
program is attempting to map a legitimate device of which
the host has no knowledge.
o Programs and device drivers which need to perform DMA I/O
to physical addresses in a virtualized hardware
environment should use the Virtual DMA Services (see the
Glossary entry for the Virtual DMA Services
Specification). Also see page 10 of the DPMI execution
environment section.
Int 31H Function 0801H [1.0]
Free Physical Address Mapping
Releases a mapping of physical to linear addresses that was
previously obtained with the Physical Address Mapping
function (Int 31H Function 0800H).
Call With:
AX = 0801H
BX:CX = linear address returned by physical address
mapping call
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8025H invalid linear address
Notes:
o The client should call this function when it is finished
using a device previously mapped to linear addresses with
the Physical Address Mapping function (Int 31H Function
0800H).
Int 31H Function 0900H [0.9]
Get and Disable Virtual Interrupt State
Disables the virtual interrupt flag and returns the previous
state of the virtual interrupt flag.
Call With:
AX = 0900H
Returns:
Virtual interrupts disabled
Carry flag= clear (this function always succeeds)
AL = 0 if virtual interrupts were previously disabled
= 1 if virtual interrupts were previously enabled
Notes:
o AH is not changed by this function. Therefore, the
previous state can be restored by simply executing
another Int 31H. See Int 31H Function 0901H.
o A client that does not need to know the prior interrupt
state can execute the CLI instruction rather than calling
this function. The instruction may be trapped by the
host and should be assumed to be very slow.
Int 31H Function 0901H [0.9]
Get and Enable Virtual Interrupt State
Enables the virtual interrupt flag and returns the previous
state of the virtual interrupt flag.
Call With:
AX = 0901H
Returns:
Virtual interrupts enabled
Carry flag= clear (this function always succeeds)
AL = 0 if virtual interrupts were previously disabled
= 1 if virtual interrupts were previously enabled
Notes:
o AH is not changed by this function. Therefore, the
previous state can be restored by simply executing
another Int 31H. See Int 31H Function 0900H.
o A client that does not need to know the prior interrupt
state can execute the STI instruction rather than calling
this function. The instruction may be trapped by the
host and should be assumed to be very slow.
Int 31H Function 0902H [0.9]
Get Virtual Interrupt State
Returns the current state of the virtual interrupt flag.
Call With:
AX = 0902H
Returns:
Carry flag= clear (this function always succeeds)
AL = 0 if virtual interrupts are disabled
= 1 if virtual interrupts are enabled
Notes:
o This function should be used in preference to the PUSHF
instruction to examine the interrupt flag, because the
PUSHF instruction returns the physical interrupt flag
rather than the virtualized (per-client) interrupt flag.
On some DPMI hosts, the physical interrupt flag will
always be enabled, even when hardware interrupts are not
being passed through to the client.
Int 31H Function 0A00H [0.9]
Get Vendor-Specific API Entry Point
Returns an address which can be called to use host-specific
extensions to the standard set of DPMI functions. DPMI 1.0
clients should avoid use of this function (see Note).
Call With:
AX = 0A00H
DS:(E)SI= selector:offset of ASCIIZ (null-terminated)
string which identifies the DPMI host vendor
Returns:
if function successful
Carry flag= clear
ES:(E)DI= selector:offset of extended API entry point
and DS, FS, GS, EAX, EBX, ECX, EDX, ESI, and EBP may be
modified.
if function unsuccessful
Carry flag= set
AX = error code
8001H unsupported function (extension not
found)
Notes:
o The null-terminated string specifies the host-specific
vendor name or some other unique identifier to obtain a
specific extension entry point. The string comparison
used to look up the API entry point is case-sensitive.
o Clients must use a FAR CALL to reach the extended API
entry point.
o All extended API parameters are specified by the vendor.
o DPMI 1.0 clients should use Int 2FH Function 168AH in
preference to this function. DPMI 1.0 hosts support this
function solely for backward compatibility with DPMI 0.9
clients.
Int 31H Function 0B00H [0.9]
Set Debug Watchpoint
Sets a debug watchpoint at the specified linear address.
Call With:
AX = 0B00H
BX:CX = linear address of watchpoint
DL = size of watchpoint (1, 2, or 4 bytes)
DH = type of watchpoint
0 = execute
1 = write
2 = read/write
Returns:
if function successful
Carry flag= clear
BX = watchpoint handle
if function unsuccessful
Carry flag= set
AX = error code
8016H too many breakpoints
8021H invalid value (in DL or DH)
8025H invalid linear address (linear address
not mapped or alignment error)
Notes:
o Under DPMI 1.0, the handle will be in the range 0-14.
Under DPMI 0.9, the handle range is not limited.
o The watchpoint handle corresponds to the bit number in
the Virtual DR6 returned in the exception frame (see Int
31H Function 0212H and page 18).
Int 31H Function 0B01H [0.9]
Clear Debug Watchpoint
Clears a debug watchpoint that was previously set using the
Set Debug Watchpoint function (Int 31H Function 0B00H), and
releases the watchpoint
handle.
Call With:
AX = 0B01H
BX = watchpoint handle
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8023H invalid handle
Int 31H Function 0B02H [0.9]
Get State of Debug Watchpoint
Returns the state of a debug watchpoint that was previously
set using the Set Debug Watchpoint function (Int 31H
Function 0B00H).
Call With:
AX = 0B02H
BX = watchpoint handle
Returns:
if function successful
Carry flag= clear
AX = watchpoint status
Bit Significance
0 0 = watchpoint has not been encountered
1 = watchpoint has been encountered
1-15 reserved
if function unsuccessful
Carry flag= set
AX = error code
8023H invalid handle
Notes:
o The client can use Int 31H Function 0B03H to clear the
watchpoint state without releasing the watchpoint handle.
Int 31H Function 0B03H [0.9]
Reset Debug Watchpoint
Resets the state of a previously defined debug watchpoint;
i.e. a subsequent call to Int 31H Function 0B02H will
indicate that the debug watchpoint has not been encountered.
Call With:
AX = 0B03H
BX = watchpoint handle
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8023H invalid handle
Int 31H Function 0C00H [1.0]
Install Resident Service Provider Callback
Protected mode resident service providers (protected mode
TSRs) can provide services to 16-bit DPMI programs, 32-bit
DPMI programs, or both. A resident service provider uses
this function to request notification from the host whenever
another DPMI program in the same virtual machine is loaded
or terminated.
Call With:
AX = 0C00H
ES:(E)DI= selector:offset of 40-byte buffer with the
following structure:
OffsetLengthContents
00H 8Descriptor for 16-bit data segment
08H 8Descriptor for 16-bit code segment
10H 2Offset of 16-bit callback procedure
12H 2Reserved
14H 8Descriptor for 32-bit data segment
1CH 8Descriptor for 32-bit code segment
24H 4Offset of 32-bit callback procedure
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8021H invalid value (access rights/type bytes
invalid, or offset outside segment
limits)
8025H invalid linear address (descriptor
references a linear address range outside
that allowed for DPMI clients)
8015H callback unavailable (host unable to
allocate resources for resident handler
initialization callback)
Notes:
o A DPMI client that uses this function declares its intent
to provide resident protected mode services. The client
must subsequently terminate and stay resident using Int
31H Function 0C01H. DPMI clients which intend to stay
resident only to provide services to real mode programs
should not use this function.
o The data structure provides room for a data descriptor, a
code descriptor, and an offset for both 16-bit and 32-bit
protected modes. The client can conveniently initialize
the descriptor fields to valid values by fetching copies
of its current code and data descriptors with Int 31H
Function 000BH.
o If only one mode is supported by the resident service
provider, then the code descriptor for the unsupported
mode should be initialized to zero.
o This function is called on the locked protected mode
stack.
o For further details on programming of resident service
providers, see page 41.
Int 31H Function 0C01H [1.0]
Terminate and Stay Resident
A resident service provider uses this function after its
initialization to terminate execution while leaving its
protected mode memory (and optionally some real mode memory)
allocated.
Call With:
AX = 0C01H
BL = return code
DX = number of paragraphs (16-byte blocks) of DOS
memory to reserve
Returns:
Nothing (this call never returns)
Notes:
o This function should only be used by DPMI clients which
only provide resident services to other DPMI protected
mode clients. If the objective is only to provide
resident services to real mode programs, the client
should use the DPMI translation service Int 31H Function
0300H to invoke DOS's Int 21H Function 31H directly.
o The value in DX only specifies the size of DOS allocated
memory to reserve. Any protected mode memory owned by
the program remains allocated unless it is explicitly
released before executing this function. Note that the
value in DX must either be 0 or a minimum of 6. If DX is
0, the DPMI host executes a DOS real mode terminate
function (Int 21H Function 4CH), and no real mode memory
is reserved. If DX is nonzero, the DPMI host requests
the DOS real mode terminate-and-stay-resident function
(Int 21H Function 31H).
o If the client has not made a prior call to Int 31H
Function 0C00H, the client will simply be terminated.
o For further details on programming of resident service
providers, see page 41.
Int 31H Function 0D00H [1.0]
Allocate Shared Memory
Allocates a memory block that may be shared by DPMI clients.
Call With:
AX = 0D00H
ES:(E)DI= selector:offset of shared memory allocation
request structure in the following format:
Offset Length Contents
00H 4 Requested length of shared
memory block (set by client, may
be zero)
04H 4 Length actually allocated (set
by host)
08H 4 Shared memory handle (set by
host)
0CH 4 Linear address of shared memory
block (set by host)
10H 6 offset32:selector of ASCIIZ
(null-terminated ASCII) name for
shared memory block (set by
client)
16H 2 Reserved
18H 4 Reserved, must be zero
Returns:
if function successful
Carry flag= clear
and the request structure fields at offsets 04H, 08H, and
0CH updated by host
if function unsuccessful
Carry flag= set
AX = error code
8012H linear memory unavailable
8013H physical memory unavailable
8014H backing store unavailable
8016H handle unavailable
8021H invalid value (name for the memory block
is too long)
and the request structure fields at offsets 04H, 08H and
0CH unmodified by host
Notes:
o For 16-bit programs, the high word of the offset32 for
the ASCIIZ name must be zero.
o The maximum length of the shared memory block name is 128
characters, including the terminal null character.
o The linear address provided by the host is guaranteed to
be the same for all clients in all virtual machines using
a shared memory block. The client must establish
addressability for the block by allocating and
initializing a descriptor with separate function calls.
o No assumptions should be made about handle values.
Successive allocations of the same shared memory block by
the same client may return distinct handles; the client
is responsible for tracking and individually deallocating
each handle.
o The first client that allocates a shared memory block
determines its size; the length requested and the length
actually allocated will always be equal, if the
allocation succeeds at all. Subsequent allocations by
the same or different clients that specify the same or a
different size will succeed, but the size of the block
will remain unchanged. The actual size of the block is
always returned to the client at offset 4 in the shared
memory allocation request structure.
o Allocation of zero-length shared memory blocks is
explicitly allowed. The handle of a zero-length block
can be used with the serialization functions (Int 31H
Functions 0D02H and 0D03H) as a semaphore for
inter-client communication. The linear address that is
returned at offset 0CH in the data structure for
zero-length blocks is undefined, and any reference to it
may produce a page fault.
o The first paragraph (16 bytes) of the shared memory block
(or the entire shared block, if smaller than 16 bytes)
will always be initialized to zero on the first
allocation and can be used by clients as an "area
initialized" indicator. For example, a shared memory
block might be used by a suite of cooperating client
programs to hold a table of static data or a subroutine
library. The first client to allocate the shared memory
block can obtain exclusive ownership of the block with
Int 31H Function 0D02H, load the necessary data or code
into the block from disk, set the first 16 bytes of the
block to a nonzero value, and finally release its
ownership
of the block with Int 31H Function 0D03H. Other clients that allocate
the shared memory block can check the "area initialized"
indicator and know that the desired code or data is
already present in memory.
o Shared memory block allocations and serializations are
tracked by the host on a per client basis. All shared
memory allocations for a client are freed by the host
when the client terminates.
Int 31H Function 0D01H [1.0]
Free Shared Memory
Deallocates a shared memory block.
Call With:
AX = 0D01H
SI:DI = handle of shared memory block to free
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8023H invalid handle
Notes:
o The shared memory handle becomes invalid after the shared
memory block is deallocated, and should not be used in
any other function call (such as serialization).
o The host maintains virtual machine use counts and a
global use count for each shared memory block. A
virtual machine use count is the number of allocation
calls (Int 31H Function 0D00H) that have been issued by a
particular virtual machine for the shared block, while
the global use count corresponds to the number of virtual
machines which have access to the block. When a virtual
machine use count reaches zero, the clients in that
virtual machine no longer have addressability to the
shared memory block; when the global use count reaches
zero, the shared memory block is destroyed by the host.
o It is the client's responsibility to free any descriptors
that it has allocated to map the shared memory block.
o Applications should not depend on this function to
release a previous successful serialization for the same
shared memory block. Serialization is only released by
this function when the virtual machine use count goes to
0 (i.e., the client no longer has access to the shared
memory block).
Int 31H Function 0D02H [1.0]
Serialize on Shared Memory
Requests serialization of a shared memory block. Successful
serialization symbolizes ownership or right of access to a
block, and can be used by DPMI clients to synchronize the
inspection or modification of a shared memory block.
Call With:
AX = 0D02H
SI:DI = shared memory block handle
DX = option flags
Bit Significance
0 0 = suspend client until serialization
available
1 = return immediately with error if
serialization not available
1 0 = exclusive serialization requested
1 = shared serialization requested
2-15 reserved, must be zero
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8004H deadlock (host detected a deadlock
situation)
8005H request cancelled with Int 31H Function
0D03H
8017H lock count exceeded
8018H exclusive serialization already owned by
another client
8019H shared serialization already owned by
another client
8023H invalid handle
Notes:
o For each client, the DPMI host maintains four different
local (virtual machine) serialization counts (exclusive,
shared, pending shared, and pending exclusive) for each
shared memory block, as well as a global serialization
count. The global serialization count is only updated
when the sum of a virtual machine's exclusive and shared
serialization counts goes from 0 to 1 (serialize) or 1 to
0 (free).
o A successful exclusive serialization blocks any
serialization request (exclusive or shared) for the same
block by another virtual machine. Exclusive
serialization should be regarded as "ownership for
writing," and should only be requested if the client
intends to modify the block. A successful shared
serialization will only block requests for exclusive
serialization by another client. Shared serialization
can be thought of as "read-only access," and should used
when the client only intends to inspect the block and
will not change its contents.
o Setting bit 0 of DX to 1 when the serialization request
is made allows a client to determine whether a shared
memory area is serialized without being suspended.
Clients which "poll" for the availability of a resource
in this manner are encouraged to yield the CPU with Int
2FH Function 1680H at appropriate intervals.
o A serialization call that causes a client to be suspended
can be canceled by a client interrupt service routine
(such as a keyboard or timer interrupt handler)
requesting the Free Serialization function (Int 31H
Function 0D03H). In such cases, the original
serialization request will return with the Carry flag set
and AX = 8005H.
o A client that has been suspended while waiting for
serialization of a shared memory block can still service
interrupts. Some hosts may need to reissue the
serialization request on behalf of the client after the
interrupt service routine returns, but this event will be
invisible to the client.
o Hosts are not required to detect deadlock. Clients that
terminate and stay resident in order to function as
resident service providers, executing in the context of
other clients, must be careful to avoid deadlocks and
incorrect sequencing in acquiring and releasing
resources.
Int 31H Function 0D03H [1.0]
Free Serialization on Shared Memory
Releases a shared memory block serialization that was
previously obtained with Int 31H Function 0D02H.
Call With:
AX = 0D03H
SI:DI = shared memory block handle
DX = option flags
Bit Significance
0 0 = release exclusive serialization
1 = release shared serialization
1 0 = don't free pending serialization
1 = free pending serialization (see Note)
2-15 reserved, must be zero
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8002H invalid state (client does not own a
successful serialization of the specified
type)
8023H invalid handle
Notes:
o For each client, the DPMI host maintains four different
local (virtual machine) serialization counts (exclusive,
shared, pending shared, and pending exclusive) for each
shared memory block, as well as a global serialization
count. The global serialization count is only updated
when the sum of a virtual machine's exclusive and shared
serialization counts goes from 0 to 1 (serialize) or 1 to
0 (free).
o A client's interrupt handler can call this function with
bit 1 of DX set to cancel a serialization request that
has suspended the main thread of execution of the same
client. In such cases, the original serialization
request will return with the Carry flag set and AX =
8005H.
Int 31H Function 0E00H [1.0]
Get Coprocessor Status
Returns information about whether or not a numeric
coprocessor exists, the type of coprocessor available (if
any), and whether or not the host or client is providing
coprocessor emulation.
Call With:
AX = 0E00H
Returns:
if function successful
Carry flag= clear (this function always succeeds in DPMI
1.0)
AX = coprocessor status
Bit Significance
0 MPv (MP bit in the virtual MSW/CR0)
0 = numeric coprocessor is disabled for
this client
1 = numeric coprocessor is enabled for
this client
1 EMv (EM bit in the virtual MSW/CR0)
0 = client is not emulating coprocessor
instructions
1 = client is emulating coprocessor
instructions
2 MPr (MP bit from the actual MSW/CR0)
0 = numeric coprocessor is not present
1 = numeric coprocessor is present
3 EMr (EM bit from the actual MSW/CR0)
0 = host is not emulating coprocessor
instructions
1 = host is emulating coprocessor
instructions
4-7 coprocessor type
00H = no coprocessor
02H = 80287
03H = 80387
04H = 80486 with numeric coprocessor
05H-0FH reserved for future
numeric processors
8-15 not applicable
if function unsuccessful
Carry flag= set (this function always fails in DPMI 0.9)
Notes:
o If the real EM (EMr) bit is set, the host is supplying or
is capable of supplying floating point emulation.
o If the MPv bit is not set, the host may not need to save
the coprocessor state for this virtual machine to improve
system performance.
o MPr bit setting should be consistent with the setting of
coprocessor type information. Ignore MPr bit information
if it is in conflict with the coprocessor type
information.
o If the virtual EM (EMv) bit i
s set, the host delivers all coprocessor exceptions to the client, and
the client is performing its own floating point emulation
(whether or not a coprocessor is present or the host also
has a floating point emulator). In other words, if the
EMv bit is set, the host sets the EM bit in the real CR0
while the virtual machine is active, and reflects
coprocessor not present faults (Int 7) to the virtual
machine.
o A client can determine the CPU type with Int 31H Function
0400H, but a client should not draw any conclusions about
the presence or absence of a coprocessor based on the CPU
type alone.
Int 31H Function 0E01H [1.0]
Set Coprocessor Emulation
Enables or disables the numeric coprocessor for this virtual
machine and the reflection of coprocessor exceptions to the
client.
Call With:
AX = 0E01H
BX = coprocessor bits
Bit Significance
0 new value of MPv bit for client's virtual
CR0
0 = disable numeric coprocessor for this
client
1 = enable numeric coprocessor for this
client
1 new value of EMv bit for client's virtual
CR0
0 = client will not supply coprocessor
emulation
1 = client will supply coprocessor
emulation
2-15 not applicable
Returns:
if function successful
Carry flag= clear
if function unsuccessful
Carry flag= set
AX = error code
8026H invalid request (client requested
disabling coprocessor on a processor
which does not support this)
Notes:
o If the MPv bit is not set, the host may not need to save
the coprocessor state for this virtual machine to improve
system performance.
o If the virtual EM (EMv) bit is set, the host delivers all
coprocessor exceptions to the client, so that the client
can provide its own floating point emulation (whether or
not a coprocessor is present or the host also has a
floating point emulator). In other words, if the EMv bit
is set, the host sets the EM bit in the real CR0 while
the client is active, and reflects coprocessor not
present faults (Int 7) to the client.
o Floating point emulation can be tested on a system with a
numeric coprocessor by using this function to enable
client handling of coprocessor exceptions and disable the
coprocessor.
o The client should use Int 31H Function 0212H to register
an exception handler for coprocessor not present faults
(Int 7) prior to setting the EMv bit with this function.
o A client can determine the CPU type with Int 31H Function
0400H, and the presence or absence of a coprocessor with
Int 31H Function 0E00H. The client should not draw any
conclusions about the presence or absence of a
coprocessor based on the CPU type alone.
Appendix B: Error Codes and Messages
Nearly all Int 31H function calls can fail, either because
of client errors, unavailable resources, or internal host
problems. Most failures due to client errors and all
failures due to unavailable resources are reported to the
client via error codes. Some client errors, such as passing
an invalid pointer in a function call, may cause the host to
fault; the client can detect these events by installing an
exception handler.
Internal host errors are handled in a host-specific manner
and generally not reported to clients with an error code.
The only exception to this is the case when a host cannot
allocate internal resources. Any Int 31H function is capable
of returning error code 8010H to indicate this condition.
A DPMI 1.0 host signals an error by returning from a
function with the Carry flag set and an error code in AX.
If the error code has bit 15 clear (0), the DPMI host is
passing a DOS error code through to the client; for a list
of these error codes, consult a DOS technical reference. If
the error code has bit 15 set (1), it is generated within
the DPMI host, and is interpreted according to the list
below. All DPMI 1.0 hosts are required to check for the
error conditions listed in this specification, and must
return the error codes that are documented for each
function.
If Int 31H is invoked with an function number that is not
defined in this specification, the DPMI host will return the
"Unsupported Function" error code 8001H. The table lists all
defined error codes and their messages. Unused error codes
are reserved for the later versions of the DPMI
spcifications.
Err
or
Cod
eNameExplanation800
1HUnsupported
functionReturned in response to
any function call which is
not implemented by this
host, because the
requested function is
either undefined or
optional.800
2HInvalid stateSome object is in the
wrong state for the
requested operation.800
3HSystem integrityThe requested operation
would endanger system
integrity, e.g., a request
to map linear addresses
onto system code or data.800
4HDeadlockHost detected a deadlock
situation.800
5HRequest
cancelledA pending serialization
request was cancelled.801
0HResource
UnavailableThe DPMI host cannot
allocate internal
resources to complete an
operation.801
1HDescriptor
unavailableHost is unable to allocate
a descriptor.801
2HLinear memory
unavailableHost is unable to allocate
the required linear
memory.801
3HPhysical memory
unavailableHost is unable to allocate
the required physical
memory.801
4HBacking store
unavailableHost is unable to allocate
the required backing
store.801
5HCallback
unavailableHost is unable to allocate
the required callback
address.801
6HHandle
unavailableHost is unable to allocate
the required handle.801
7HLock count
exceededA locking operation
exceeds the maximum count
maintained by the host.801
8HResource owned
exclusivelyA request for
serialization of a shared
memory block could not be
satisfied because it is
already serialized
exclusively by another
client.801
9HResource owned
sharedA request for exclusive
serialization of a shared
memory block could not be
satisfied because it is
already serialized shared
by another client.802
1HInvalid valueA numeric or flag
parameter has an invalid
value.802
2HInvalid selectorA selector does not
correspond to a valid
descriptor.802
3HInvalid handleA handle parameter is
invalid.802
4HInvalid callbackA callback parameter is
invalid.802
5HInvalid linear
addressA linear address range
(either supplied as a
parameter or implied by
the call) is invalid.802
6HInvalid requestThe request is not
supported by the
underlying hardware.